home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 3
/
Aminet 3 - July 1994.iso
/
Aminet
/
gfx
/
pbm
/
source1.lha
/
netpbm
/
pnm
/
pstopnm
< prev
next >
Wrap
Text File
|
1993-01-27
|
8KB
|
294 lines
#!/bin/csh -f
#
# Uses ghostscript to translate an Encapsulated PostScript file to
# Portable Anymap format file(s).
# pstopnm will create as many files as the number of pages in
# the Postscript document. The name of the files will be
# psfile001.ppm, psfile002.ppm, etc.
# The ouput files will contain the area inside the BoundingBox.
# If BoundingBox parameters are not found in the PostScript
# document, default values are used.
#
#
# Usage: pstopnm [-forceplain] [-help] [-llx s] [-lly s]
# [-urx s] [-ury s] [-nocrop] [-pbm|-pgm|-ppm]
# [-verbose] [-xborder n] [-xmax n] [-xsize n]
# [-yborder n] [-ymax n] [-ysize n]
# [-portrait] [-landscape] psfile[.ps]
#
# Copyright (C) 1992 by Alberto Accomazzi, Smithsonian Astrophysical
# Observatory (alberto@cfa.harvard.edu).
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
# provided that the above copyright notice appear in all copies and
# that both that copyright notice and this permission notice appear
# in supporting documentation. This software is provided "as is"
# without express or implied warranty.
#
set noglob
set progname = $0
set progname = $progname:t
set filtertail = "raw"
set filterhead = "ppm"
set xsize = 0
set ysize = 0
set xres = ""
set yres = ""
# default values: max image x and y sizes
set xmax = 612
set ymax = 792
# default values: image area fits in a 8.5x11 sheet with 1 inch border
set llx = 72
set lly = 72
set urx = 540
set ury = 720
# default values: x and y borders are 10% of x and y size
set xborder = "0.1"
set yborder = "0.1"
# default values: orientation is unknown
set orient = 0
set psfile = ""
set USAGE = "Usage: $progname [-forceplain] [-help] [-llx s] [-lly s]\
[-urx s] [-ury s] [-landscape] [-portrait]\
[-nocrop] [-pbm|-pgm|-ppm] [-verbose] [-xborder s] [-xmax s]\
[-xsize s] [-yborder s] [-ymax s] [-ysize s] psfile[.ps]"
alias usage 'echo $USAGE; exit 1'
while ($#argv > 0)
switch ($argv[1])
case -h*: # -help
usage
breaksw
case -pbm:
case -pgm:
case -ppm:
set filterhead = `echo "$argv[1]" | sed "s/-//1"`
breaksw
case -llx:
shift argv
if ($#argv == 0) eval usage
set llx = `(echo "scale=4";echo "$argv[1] * 72")|bc -l`
set nobb
breaksw
case -lly:
shift argv
if ($#argv == 0) eval usage
set lly = `(echo "scale=4";echo "$argv[1] * 72")|bc -l`
set nobb
breaksw
case -urx:
shift argv
if ($#argv == 0) eval usage
set urx = `(echo "scale=4";echo "$argv[1] * 72")|bc -l`
set nobb
breaksw
case -ury:
shift argv
if ($#argv == 0) eval usage
set ury = `(echo "scale=4";echo "$argv[1] * 72")|bc -l`
set nobb
breaksw
case -no*: # -nocrop
set nocrop
breaksw
case -xs*: # -xsize
shift argv
if ($#argv == 0) eval usage
@ xsize = $argv[1]
breaksw
case -ys*: # -ysize
shift argv
if ($#argv == 0) eval usage
@ ysize = $argv[1]
breaksw
case -xm*: # -xmax
shift argv
if ($#argv == 0) eval usage
@ xmax = $argv[1]
breaksw
case -ym*: # -ymax
shift argv
if ($#argv == 0) eval usage
@ ymax = $argv[1]
breaksw
case -xb*: # -xborder
shift argv
if ($#argv == 0) eval usage
set xborder = $argv[1]
breaksw
case -yb*: # -yborder
shift argv
if ($#argv == 0) eval usage
set yborder = $argv[1]
breaksw
case -f*: # -forceplain
set filtertail = ""
breaksw
case -v*: # -verbose
set verb
breaksw
case -po*: # -portrait
set orient = 1
breaksw
case -la*: # -landscape
set orient = 2
breaksw
case -*:
echo "${progname}: Unknown option $argv[1]"
usage
breaksw
default: # input file
set psfile = $argv[1]
set ppmfile = `basename $argv[1] .ps`
breaksw
endsw
shift argv
end
if ($psfile =~ "") eval usage
if (! -f $psfile) then
echo "${progname}: file $psfile not found"
usage
endif
set bb = `grep "%%BoundingBox" $psfile`
if ($?nobb == 0 && $#bb == 5) then
set llx = $bb[2]
set lly = $bb[3]
set urx = $bb[4]
set ury = $bb[5]
else
if ($?nobb == 0) \
echo "${progname}: warning: BoundingBox not found in input file"
endif
set tmpsx = `(echo "scale=4";echo "$urx - $llx")|bc -l`
set tmpsy = `(echo "scale=4";echo "$ury - $lly")|bc -l`
# see if orientation was specified
if ($orient == 0) then
# no orientation was specified; compute default orientation
set tmpx = 0
set tmpy = 0
set tmpsx1 = $tmpsx:r
set tmpsy1 = $tmpsy:r
# default is landscape mode
set orient = 2
if ($xsize == 0 && $ysize == 0) then
set tmpx = $xmax
set tmpy = $ymax
else
if ($xsize != 0) set tmpx = $xsize
if ($ysize != 0) set tmpy = $ysize
endif
if ($tmpx == 0 || $tmpy == 0) then
# only one size was specified
if ($tmpsy1 > $tmpsx1) set orient = 1
else
# no size or both sizes were specified
if ($tmpsy1 > $tmpsx1 && $tmpy > $tmpx) set orient = 1
if ($tmpsx1 > $tmpsy1 && $tmpx > $tmpy) set orient = 1
endif
endif
# now reset BoundingBox llc and total size to take into account margin
set llx = `(echo "scale=4";echo "$llx - $tmpsx * $xborder")|bc -l`
set lly = `(echo "scale=4";echo "$lly - $tmpsy * $yborder")|bc -l`
set urx = `(echo "scale=4";echo "$urx + $tmpsx * $xborder")|bc -l`
set ury = `(echo "scale=4";echo "$ury + $tmpsy * $yborder")|bc -l`
# compute image area size
set sx = `(echo "scale=4";echo "$tmpsx + 2 * $xborder * $tmpsx")|bc -l`
set sy = `(echo "scale=4";echo "$tmpsy + 2 * $yborder * $tmpsy")|bc -l`
if ($orient != 1) then
# render image in landscape mode
set tmpsx = $sx
set sx = $sy
set sy = $tmpsx
endif
# if xsize or ysize was specified, compute resolution from them
if ($xsize != 0) set xres = `(echo "scale=4";echo "$xsize *72 / $sx")|bc -l`
if ($ysize != 0) set yres = `(echo "scale=4";echo "$ysize *72 / $sy")|bc -l`
if ($xres =~ "" && $yres !~ "") then
# ysize was specified, xsize was not; compute xsize based on ysize
set xres = $yres
set xsize = `(echo "scale=4";echo "$sx * $xres /72 + 0.5")|bc -l`
set xsize = $xsize:r
else
if ($yres =~ "" && $xres !~ "") then
# xsize was specified, ysize was not; compute ysize based on xsize
set yres = $xres
set ysize = `(echo "scale=4";echo "$sy * $yres /72 + 0.5")|bc -l`
set ysize = $ysize:r
else
if ($xres =~ "" && $yres =~ "") then
# neither xsize nor ysize was specified; compute them from
# xmax and ymax
set xres = `(echo "scale=4";echo "$xmax *72/$sx")|bc -l`
set yres = `(echo "scale=4";echo "$ymax *72/$sy")|bc -l`
set xres = `(echo "scale=4";echo "if($xres>$yres)$yres";echo "if($yres>$xres)$xres")|bc -l`
set yres = $xres
if ($?nocrop) then
# keep output file dimensions equal to xmax and ymax
set xsize = $xmax
set ysize = $ymax
else
set xsize = `(echo "scale=4";echo "$sx * $xres /72+0.5")|bc -l`
set ysize = `(echo "scale=4";echo "$sy * $yres /72+0.5")|bc -l`
endif
set xsize = $xsize:r
set ysize = $ysize:r
endif
endif
endif
# translate + rotate image, if necessary
if ($orient == 1) then
# portrait mode
# adjust offsets
set llx = `(echo "scale=4";echo "$llx - ($xsize *72/$xres - $sx)/2")|bc -l`
set lly = `(echo "scale=4";echo "$lly - ($ysize *72/$yres - $sy)/2")|bc -l`
set pstrans = "$llx neg $lly neg translate"
else
# landscape mode
# adjust offsets
set llx = `(echo "scale=4";echo "$llx - ($ysize *72/$yres - $sy)/2")|bc -l`
set ury = `(echo "scale=4";echo "$ury + ($xsize *72/$xres - $sx)/2")|bc -l`
set pstrans = "90 rotate $llx neg $ury neg translate"
endif
if ($?verb) then
echo "sx = $sx"
echo "sy = $sy"
echo "xres = $xres"
echo "yres = $yres"
echo "xsize = $xsize"
echo "ysize = $ysize"
echo -n "orientation "
if ($orient == 1) then
echo "portrait"
else
echo "landscape"
endif
echo "PS header: $pstrans"
endif
echo "${progname}: writing $filterhead file(s)"
echo $pstrans | \
gs -sDEVICE=${filterhead}${filtertail} \
-sOutputFile=$ppmfile%03d.$filterhead \
-g${xsize}x${ysize} \
-r${xres}x${yres} \
-q - $psfile